home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / ddj0492.zip / LORENZ.ASC < prev    next >
Text File  |  1992-03-10  |  4KB  |  183 lines

  1. _WINDOWS PROGRAMMING WITH BASIC_
  2. by Raymond J. Schneider
  3.  
  4.  
  5. [LISTING ONE]
  6.  
  7. /* Lorenz Equations in GFA BASIC
  8. /* Copyright 1991 Raymond J. Schneider
  9. XEND=0,YEND=0,ZEND=0 //Initializes end of plot run variables
  10. /* Configure and Open Parent Window
  11. pstyle%=      WS_OVERLAPPEDWINDOW
  12. OR pstyle%, WS_CLIPCHILDREN
  13. OR pstyle%, WS_VISIBLE
  14. TITLEW #1, "Lorenz Equations"
  15. PARENTW #1,0,0,_X,_Y,pstyle% //Open full window
  16.  
  17. /* Configure three child windows
  18. cstyle%=0
  19. cstyle%=  WS_SYSMENU
  20.  
  21. /* Title the windows
  22. TITLEW #2, "Lorenz XY-View"
  23. TITLEW #3, "Lorenz YZ-View"
  24. TITLEW #4, "Lorenz ZX-View"
  25.  
  26. /* Initalize Menu Structure
  27. DIM m$(15)
  28. m$(0)="&Views"   //First Menu Item
  29. m$(1)="&XY-View" // Sub-Menu Items
  30. m$(2)="&YZ-View"
  31. m$(3)="&ZX-View"
  32. m$(4)=""         // Null-string terminates sub-menus
  33. m$(5)="&Control"
  34. m$(6)="&Set Parameters"
  35. m$(7)="&GO"
  36. m$(8)=""
  37. m$(9)=""
  38. MENU m$( )
  39.  
  40. /* Main Program
  41. cww%=_X/2-30,chh%=_Y/2-30
  42. ON MENU MESSAGE GOSUB HandleMessage( )
  43. DO
  44.   GETEVENT
  45.   IF MENU(1)=20 //Then a Menu Selection Has been Pressed
  46.     /* Process Menu Selection
  47.     SWITCH MENU(0)
  48.     CASE 1 // Open XY-View
  49.       CHILDW #2,1,5,5,cww%,chh%,cstyle%
  50.     CASE 2 // Open YZ-View
  51.       CHILDW #3,1,cww%+8,5,cww%,chh%,cstyle%
  52.     CASE 3 // Open ZX-View
  53.       CHILDW #4,1,5,chh%+8,cww%,chh%,cstyle%
  54.     CASE 6 //Set-Parameters
  55.       EXIT IF   DLGRV&<>0
  56.       SetDialog()
  57.       DO
  58.         SLEEP
  59.       UNTIL DLGRV&
  60.       TEXT 0,0,"Sigma="+STR$(SIGMA)
  61.       TEXT 0,12,"Rho= "+STR$(RHO)
  62.       TEXT 0,24,"B= "+STR$(B)
  63.     CASE 7 // Calculate Lorenz and Plot in Windows
  64.       TOPW #2
  65.       IF XEND=0  //Initialization of starting conditions X,Y,Z
  66.         X=1
  67.       ELSE
  68.         X=XEND
  69.       ENDIF
  70.       IF YEND=0
  71.         Y=1
  72.       ELSE
  73.         Y=YEND
  74.       ENDIF
  75.       IF ZEND=0
  76.         Z=1
  77.       ELSE
  78.         Z=ZEND
  79.       ENDIF
  80.       PlotLorenz(X,Y,Z,100,1)
  81.       TOPW #3
  82.       PlotLorenz(X,Y,Z,100,2)
  83.       TOPW #4
  84.       PlotLorenz(X,Y,Z,100,3)
  85.     ENDSWITCH
  86.   ENDIF
  87.   IF MENU(1)=4
  88.     SWITCH MENU(14)
  89.     CASE 2
  90.       CLOSEW #2
  91.     CASE 3
  92.       CLOSEW #3
  93.     CASE 4
  94.       CLOSEW #4
  95.     ENDSWITCH
  96.   ENDIF
  97.   EXIT IF MENU(1)=4 && MENU(14)=1
  98. LOOP
  99. CLOSEW #1
  100. END
  101.  
  102. PROCEDURE HandleMessage( )
  103.   IF DLG(1)=MENU(15)
  104.   ENDIF /*Discard General Messages
  105.   DLGRV&=0
  106.   hw%=GetParent(MENU(15))
  107.   IF hw%=DLG(1)
  108.     SWITCH MENU(6)
  109.     CASE 100
  110.       IF MENU(1)=30
  111.         GetText(1,101,SIGMA$)
  112.         GetText(1,102,RHO$)
  113.         GetText(1,103,B$)
  114.         SIGMA=VAL(SIGMA$),RHO=VAL(RHO$),B=VAL(B$)
  115.         DLGRV&=MENU(6)
  116.       ENDIF
  117.     ENDSWITCH
  118.   ENDIF
  119. RETURN
  120.  
  121. PROCEDURE GetText(d|,di&,VAR a$)
  122.   LOCAL buffer$
  123.   buffer$=SPACE$(100)
  124.   IF GetWindowText(DLGITEM(d|,di&),V:buffer$,LEN(buffer$))>0
  125.     a$=CHAR{V:buffer$}
  126.   ELSE
  127.     a$=""
  128.   ENDIF
  129. RETURN
  130.  
  131. PROCEDURE SetDialog()
  132.   s%=WS_TABSTOP
  133.   sb%=s%
  134.   sb%|=BS_DEFPUSHBUTTON
  135.   seb%=s%
  136.   seb%|=WS_BORDER
  137.   seb%|=ES_UPPERCASE
  138.   ~SetFocus(DLGITEM(1,100))
  139.   DLGRV&=0
  140.   DIALOG #1,325,175,300,160,"Set Parameters"
  141.     DLGBASE UNIT
  142.     DEFPUSHBUTTON "OK",100,80,65,14,12,sb%
  143.     EDITTEXT "",101,80,10,40,12,seb%
  144.     EDITTEXT "",102,80,30,40,12,seb%
  145.     EDITTEXT "",103,80,50,40,12,seb%
  146.     RTEXT "SIGMA",104,10,10,55,12
  147.     RTEXT "RHO",105,10,30,55,12
  148.     RTEXT "B",106,10,50,55,12
  149.   ENDDIALOG
  150.   SHOWDIALOG #1
  151. RETURN
  152.  
  153. PROCEDURE PlotLorenz(X,Y,Z,N%,I%)
  154.   /* SIGMA, RHO, B assumed Global
  155.   LOCAL LX,LY,LZ,LX1,LY1,LZ1,DT,j%
  156.   LOCAL DX,DY,DZ
  157.   PX=_X/4+50,PY=_Y/4+10 // Plot Offsets
  158.   LX=X,LY=Y,LZ=Z,DT=.01
  159.   FOR j%=1 TO N%
  160.     DX=SIGMA*(LY-LX)*DT
  161.     DY=(-LX*LZ+RHO*LX-LY)*DT
  162.     DZ=(LX*LY - B*LZ)*DT
  163.     LX1=LX+DX
  164.     LY1=LY+DY
  165.     LZ1=LZ+DZ
  166.     SWITCH I%
  167.     CASE 1 //PLOT XY
  168.       LINE LX+PX,LY+PY,LX1+PX,LY1+PY
  169.     CASE 2 //PLOT YZ
  170.       LINE LY+PX,LZ+PY,LY1+PX,LZ1+PY
  171.     CASE 3 //PLOT ZX
  172.       LINE LZ+PX,LX+PY,LZ1+PX,LX1+PY
  173.     ENDSWITCH
  174.     LX=LX1,LY=LY1,LZ=LZ1 // Update function
  175.   NEXT j%
  176.   XEND=LX,YEND=LY,ZEND=LZ
  177. RETURN
  178.  
  179.  
  180.  
  181.  
  182.  
  183.